# !/bin/bash
#
# Simple test set for linux hard/sym-links
#
# $Date: 2009-11-20 18:24:37 -0300 (Fri, 20 Nov 2009) $
# $Author: Lord Hobborg $
# $Cathedra: Operative Systems, FaMAF, UNC $
# $Acknowledgements: Nicolas Wolovick, Daniel Moisset $
#
# Visit "Advanced Bash-Scripting Guide" http://tldp.org/LDP/abs/html/
# for more reference on shell scripting



TIMES=3
MANY_TIMES=`expr $TIMES \* $TIMES`
A_DIR="DIR.tmp"


die()
{
	echo "Falló!"
	exit 1
}

limpieza()
{
	i=0
	while [ "$i" -lt "$TIMES" ]
	do
		rm "$i"
		let i=i+1
	done
}


echo ""
echo "·~-~·~-~·~-~·~-~·~-~·~-~·  ¡¡¡ AGARRENSEN !!!  ·~-~·~-~·~-~·~-~·~-~·~-~·~"
echo ""
echo "·~-~·~-~·~-~·~-~·~-~·  PRUEBAS DE LINKS SIMBÓLICOS  ·~-~·~-~·~-~·~-~·~-~·"
echo ""


echo "@~~> Pruebas básicas de políticas implementativas"

echo "     Puedo leer el symlink como si fuera el archivo"
echo "You are sick, twisted and perverted.  I like that in a person" > tastes
ln -s tastes slink
diff tastes slink || die

echo "     Puedo escribir el symlink como si fuera el archivo"
echo "When they asked me to please go fuck myself" >> slink
diff tastes slink || die

echo "     Al borrar el symlink se mantiene el archivo"
rm slink
ls tastes > /dev/zero || die

echo "     Al borrar el archivo se rompe el symlink"
ln -s tastes slink
rm tastes
cat slink > /dev/zero && die

echo "     Al recrear el archivo se revive al symlink"
touch tastes
cat slink > /dev/zero || die

echo "     Al rascarme el culo me deja de picar"
rm tastes slink || die

echo "Tests al 20%"


echo "@~~> Prueba de encadenamiento paralelo de $TIMES symlinks hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	ln -s $0 "$i" || die
	let i=i+1
done

echo "     Todos los symlinks están apuntando hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	diff "$i" $0 || die
	let i=i+1
done

limpieza || die


echo "@~~> Prueba de encadenamiento secuencial de $TIMES symlinks hacia $0"
i=0
ln -s $0 "$i"
let j=i
let i=i+1
while [ "$i" -lt "$TIMES" ]
do
	ln -s "$j" "$i" || die
	file "$i"
	let j=i
	let i=i+1
done

echo "     Todos los symlinks están apuntando hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	diff "$i" $0 || die
	let i=i+1
done

limpieza || die


echo "@~~> Pruebas con directorios"
mkdir $A_DIR
ln -s $A_DIR s_dir
cp $0 s_dir
cat $0 > real
cd s_dir
cat $0 > ../linked
cd ..
diff real linked || die
cat s_dir/$0 > linked
diff real linked || die
rm -r real linked $A_DIR s_dir || die


echo "@~~> Pruebas con ejecutables, permisos y directorios"
mkdir $A_DIR
ln -s $A_DIR s_dir
echo "echo \"Ser\" > s_dir/Escencia" > _do
ln -s _do s_do
chmod 744 _do
echo "echo \"No ser\" > s_dir/Escencia" > _undo
ln -s _undo s_undo
chmod 744 _undo
i=0
while [ "$i" -lt "$MANY_TIMES" ]
do
	if [ `expr $i % 2` -eq 0 ] # Si "$i" es par
	then
		./s_do
	else
		./s_undo
	fi
	let i=i+1
done
echo "La escencia de la vida es \"" `cat s_dir/Escencia` `echo "\""`
rm -r $A_DIR _do _undo s_dir s_do s_undo || die

echo "Tests al 50%"

echo ""
echo "~-~·~-~·~-~·~-~·~-~·~-~·  PRUEBAS DE LINKS DUROS  ·~-~·~-~·~-~·~-~·~-~·~-"
echo ""


echo "@~~> Pruebas básicas de políticas implementativas"

echo "     Puedo leer el link como si fuera el archivo"
echo "Excellent day to have a rotten day." > attitude
ln attitude hlink
diff attitude hlink || die

echo "     Puedo escribir el link como si fuera el archivo"
echo "You must have a real need" >> hlink
diff attitude hlink || die

echo "     Al borrar el link se mantiene el archivo"
rm hlink
ls attitude > /dev/zero || die

echo "     Al borrar el archivo se mantiene el link"
ln attitude hlink
rm attitude
cat hlink > /dev/zero || die

rm hlink || die


echo "@~~> Prueba de encadenamiento paralelo de $TIMES links hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	ln $0 "$i" || die
	let i=i+1
done

echo "     Todos los links están apuntando hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	diff "$i" $0 || die
	let i=i+1
done

limpieza || die


echo "@~~> Prueba de encadenamiento secuencial de $TIMES links hacia $0"
i=0
ln -s $0 "$i"
let j=i
let i=i+1
while [ "$i" -lt "$TIMES" ]
do
	ln "$j" "$i" || die
	file "$i"
	let j=i
	let i=i+1
done

echo "     Todos los links están apuntando hacia $0"
i=0
while [ "$i" -lt "$TIMES" ]
do
	diff "$i" $0 || die
	let i=i+1
done

limpieza || die

echo "Tests al 85%"


echo "@~~> Pruebas con directorios"
mkdir $A_DIR
echo "     No me permiten hard-linkear un directorio"
ln  $A_DIR l && die
rmdir $A_DIR


echo "@~~> Pruebas con ejecutables y permisos"
mkdir $A_DIR
ln -s $A_DIR s_dir
echo "echo \"Ser\" > s_dir/Escencia" > _do
ln _do h_do
chmod 744 _do
echo "echo \"No ser\" > s_dir/Escencia" > _undo
ln _undo h_undo
chmod 744 _undo
i=0
while [ "$i" -lt "$MANY_TIMES" ]
do
	if [ `expr $i % 2` -eq 0 ] # Si "$i" es par
	then
		./h_do
	else
		./h_undo
	fi
	let i=i+1
done
echo "La escencia de la vida es \"" `cat s_dir/Escencia` `echo "\""`
rm -r $A_DIR _do _undo s_dir h_do h_undo || die

echo "Tests al 100%"

exit 0

